package com.jelly.config.shiro.filter;

import com.jelly.common.constant.ShiroConstant;
import com.jelly.common.util.web.WebUtilsPro;
import com.jelly.config.shiro.token.TokenUtil;
import com.jelly.web.modules.staff.user.domain.User;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.AccessControlFilter;
import org.apache.shiro.web.util.WebUtils;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * <h4>功能:【自定义权限过滤器】【创建人：QIAOLIANG】</h4>
 *
 * @时间:2018/7/5 0005 9:46
 * @备注:<h4></h4>
 */
public class PermissionFilter  extends AccessControlFilter {

    /**
     * <h4>【过滤器访问地址，判断是否有权限】【2018年3月23日 上午10:06:52】</h4>
     *
     * @author QL
     * @param request
     * @param response
     * @param mappedValue
     *            表示写在过滤器器中括号里面的字符串 mappedValue 就是 [urls] 配置中过滤器器参数部分
     * @return
     * @throws Exception
     */
    @Override
    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)
            throws Exception {

        Subject sub = getSubject(request, response);

        String[] str = (String[]) mappedValue;

        if (str.length > 0) {
            for (String string : str) {
                if (sub.isPermitted(string)) {
                    return true;
                }
            }
        }

        // 过滤器当前request请求 是否为ajax请求
        if (WebUtilsPro.isAjaxRequest((HttpServletRequest) request)) {
            Map<String, Object> resultMap = new HashMap<String, Object>();
            resultMap.put("status", false);
            resultMap.put("errorMsg", "您没有权限！");
            WebUtilsPro.out(response, resultMap);
        }
        return false;
    }

    /**
     * <h4>【当 isAccessAllowed 返回 false 的时候，才会执行 method onAccessDenied】【2018年3月23日
     * 上午10:06:52】</h4>
     *
     * @author QL
     * @param request
     * @param response
     * @return
     * @throws Exception
     */
    @Override
    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {

        if (!WebUtilsPro.isAjaxRequest((HttpServletRequest) request)) {
            User user = TokenUtil.getToken();
            // 判断当前用户是否已登录
            if (null != user.getLoginAccount() || isLoginRequest(request, response)) {
                WebUtils.issueRedirect(request, response, ShiroConstant.OUT_JURISDICTION);
            } else {
                WebUtils.issueRedirect(request, response, ShiroConstant.LOGIN);
            }
        }

        return false;
    }

}